/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * dlgModificarPerfil.java
 *
 * Created on Oct 17, 2011, 12:37:24 AM
 */

package visual.Seguridad;

import bentity.bePerfil;
import bentity.bePerfilxPrivilegio;
import bentity.bePrivilegio;
import bentity.beUsuario;
import blogic.blLog;
import blogic.blPerfil;
import blogic.blPerfilxPrivilegio;
import blogic.blPrivilegio;
import java.util.ArrayList;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;

/**
 *
 * @author renzo
 */
public class dlgModificarPerfil extends javax.swing.JDialog {
    String strPerfil;
    private beUsuario usuario = null;

    /** Creates new form dlgModificarPerfil */
    public dlgModificarPerfil(pnfMantenimientoPerfil parent, boolean modal, beUsuario usuario) {
        super((java.awt.Frame)null, modal);
        initComponents();
        this.usuario = usuario;
        this.setBounds(0, 0, this.getWidth(), this.getHeight());
        this.setModal(true);
        visualHelper.centrarDialogoEnPantalla(this);        
        
        this.strPerfil = parent.getCboPerfil().getSelectedItem().toString();
        this.listarPrivilegios();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lblTitulo = new javax.swing.JLabel();
        lblNombre = new javax.swing.JLabel();
        txtNombre = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        lstDisponibles = new javax.swing.JList();
        btnModificar = new javax.swing.JButton();
        btnRestaurar = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        btnModificar1 = new javax.swing.JButton();
        btnModificar2 = new javax.swing.JButton();
        lblNombre1 = new javax.swing.JLabel();
        lblNombre2 = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        lstActuales = new javax.swing.JList();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Thor Store - Modicación Perfil");
        setAlwaysOnTop(true);
        setMinimumSize(new java.awt.Dimension(635, 536));
        setModal(true);
        getContentPane().setLayout(null);

        lblTitulo.setFont(new java.awt.Font("Dialog", 0, 36));
        lblTitulo.setForeground(new java.awt.Color(0, 0, 0));
        lblTitulo.setText("Modificar Perfil");
        getContentPane().add(lblTitulo);
        lblTitulo.setBounds(160, 10, 269, 43);

        lblNombre.setFont(new java.awt.Font("DejaVu Sans", 0, 12));
        lblNombre.setForeground(new java.awt.Color(0, 0, 0));
        lblNombre.setText("Nombre");
        getContentPane().add(lblNombre);
        lblNombre.setBounds(120, 70, 49, 15);

        txtNombre.setFont(new java.awt.Font("DejaVu Sans", 0, 12));
        txtNombre.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNombreActionPerformed(evt);
            }
        });
        getContentPane().add(txtNombre);
        txtNombre.setBounds(200, 70, 203, 25);

        lstDisponibles.setFont(new java.awt.Font("DejaVu Sans", 0, 12));
        lstDisponibles.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Mantener productos", "Matener clientes", "Mantener proveedores", "Configurar la distribución del local", "Mantenimiento de perfil", "Mantener racks", "Bloquea rack por mantenimiento" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jScrollPane2.setViewportView(lstDisponibles);

        getContentPane().add(jScrollPane2);
        jScrollPane2.setBounds(20, 150, 250, 300);

        btnModificar.setBackground(new java.awt.Color(240, 235, 226));
        btnModificar.setFont(new java.awt.Font("Dialog", 0, 12));
        btnModificar.setForeground(new java.awt.Color(0, 0, 0));
        btnModificar.setText(">>");
        btnModificar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificarActionPerformed(evt);
            }
        });
        getContentPane().add(btnModificar);
        btnModificar.setBounds(280, 220, 60, 27);

        btnRestaurar.setBackground(new java.awt.Color(240, 235, 226));
        btnRestaurar.setFont(new java.awt.Font("Dialog", 0, 12));
        btnRestaurar.setForeground(new java.awt.Color(0, 0, 0));
        btnRestaurar.setLabel("Restaurar");
        btnRestaurar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRestaurarActionPerformed(evt);
            }
        });
        getContentPane().add(btnRestaurar);
        btnRestaurar.setBounds(250, 470, 120, 27);

        btnCancelar.setBackground(new java.awt.Color(240, 235, 226));
        btnCancelar.setFont(new java.awt.Font("Dialog", 0, 12));
        btnCancelar.setForeground(new java.awt.Color(0, 0, 0));
        btnCancelar.setText("Cancelar");
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });
        getContentPane().add(btnCancelar);
        btnCancelar.setBounds(420, 470, 120, 27);

        btnModificar1.setBackground(new java.awt.Color(240, 235, 226));
        btnModificar1.setFont(new java.awt.Font("Dialog", 0, 12));
        btnModificar1.setForeground(new java.awt.Color(0, 0, 0));
        btnModificar1.setText("Modificar");
        btnModificar1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificar1ActionPerformed(evt);
            }
        });
        getContentPane().add(btnModificar1);
        btnModificar1.setBounds(80, 470, 120, 27);

        btnModificar2.setBackground(new java.awt.Color(240, 235, 226));
        btnModificar2.setFont(new java.awt.Font("Dialog", 0, 12));
        btnModificar2.setForeground(new java.awt.Color(0, 0, 0));
        btnModificar2.setText("<<");
        btnModificar2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificar2ActionPerformed(evt);
            }
        });
        getContentPane().add(btnModificar2);
        btnModificar2.setBounds(280, 260, 60, 27);

        lblNombre1.setFont(new java.awt.Font("DejaVu Sans", 0, 12));
        lblNombre1.setForeground(new java.awt.Color(0, 0, 0));
        lblNombre1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblNombre1.setText("Privilegios Actuales");
        getContentPane().add(lblNombre1);
        lblNombre1.setBounds(350, 120, 250, 20);

        lblNombre2.setFont(new java.awt.Font("DejaVu Sans", 0, 12));
        lblNombre2.setForeground(new java.awt.Color(0, 0, 0));
        lblNombre2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lblNombre2.setText("Privilegios Disponibles");
        getContentPane().add(lblNombre2);
        lblNombre2.setBounds(19, 120, 250, 20);

        lstActuales.setFont(new java.awt.Font("DejaVu Sans", 0, 12));
        jScrollPane3.setViewportView(lstActuales);

        getContentPane().add(jScrollPane3);
        jScrollPane3.setBounds(350, 150, 248, 301);

        pack();
    }// </editor-fold>//GEN-END:initComponents


    private void txtNombreActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtNombreActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_txtNombreActionPerformed

    private void btnModificarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnModificarActionPerformed
        
        ArrayList<Object> lstPrivilegiosDisponibles = new ArrayList<Object>();
        for (int i=0; i<this.lstDisponibles.getModel().getSize();i++)
            lstPrivilegiosDisponibles.add(this.lstDisponibles.getModel().getElementAt(i));

        ArrayList<Object> lstPrivilegiosActuales = new ArrayList<Object>();
        for (int i=0; i<this.lstActuales.getModel().getSize();i++)
            lstPrivilegiosActuales.add(this.lstActuales.getModel().getElementAt(i));


        if (this.lstDisponibles.getSelectedIndex() != -1){
            Object[] lstPrivilegiosNuevos  = this.lstDisponibles.getSelectedValues();

            int[] indices = this.lstDisponibles.getSelectedIndices();
            for (int i=indices.length; i>0; i--)
                lstPrivilegiosDisponibles.remove(indices[i-1]);


            DefaultListModel modeloDisp = new DefaultListModel();
            DefaultListModel modeloAct = new DefaultListModel();

            for (int i=0; i<lstPrivilegiosDisponibles.size();i++){
                modeloDisp.addElement(lstPrivilegiosDisponibles.get(i));
            }


            for (int i=0; i<lstPrivilegiosActuales.size();i++){
                modeloAct.addElement(lstPrivilegiosActuales.get(i));
            }

            for (int i=0; i<lstPrivilegiosNuevos.length;i++){
                modeloAct.addElement(lstPrivilegiosNuevos[i]);
            }

            this.lstActuales.setModel(modeloAct);
            this.lstDisponibles.setModel(modeloDisp);
        }
        else
            JOptionPane.showMessageDialog(this, "Debe elegir un privilegio.", "Información", JOptionPane.INFORMATION_MESSAGE);
}//GEN-LAST:event_btnModificarActionPerformed

    private void btnRestaurarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRestaurarActionPerformed
        // TODO add your handling code here:
        this.listarPrivilegios();

}//GEN-LAST:event_btnRestaurarActionPerformed

    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
        // TODO add your handling code here:
        this.setVisible(false);
        this.dispose();
}//GEN-LAST:event_btnCancelarActionPerformed

    private void btnModificar1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnModificar1ActionPerformed
        // TODO add your handling code here:
        String strNombre = "";
        blPerfil gestorPerfiles = new blPerfil();
        ArrayList <bePerfil> listaPerfiles = new ArrayList <bePerfil>();

        try{
            //Se valida los campos nombre y cargo
            if (this.txtNombre.getText().equals("")){
                visualHelper.mostrarMensajeError("Debe de llenar el campo Nombre.");
                return;
            }
            
            if (!(this.strPerfil.equals(this.txtNombre.getText()))){
                listaPerfiles = gestorPerfiles.queryAll();
                    for (int i=0; i<listaPerfiles.size();i++)
                        if (listaPerfiles.get(i).getDescripcion().equals(this.txtNombre.getText())){
                            visualHelper.mostrarMensajeError("El perfil ingresado ya existe.");
                            return;
                        }
            }

            strNombre = this.txtNombre.getText();
            bePerfil perfil = new bePerfil();           
            perfil = gestorPerfiles.queryByNombre(this.strPerfil);
            bePerfil nuevoPerfil = new bePerfil(perfil.getId(),strNombre,perfil.C_ACTIVO);

            //Se obtiene los privilegios actuales            
            ArrayList<bePrivilegio> lstPrivilegios = new ArrayList<bePrivilegio>();
            blPrivilegio gestorPrivilegios = new blPrivilegio();
            for (int i=0; i<this.lstActuales.getModel().getSize();i++){
                bePrivilegio privilegio = gestorPrivilegios.queryByNombre((String)this.lstActuales.getModel().getElementAt(i));
                lstPrivilegios.add(privilegio);
            }

            gestorPerfiles.modificar(nuevoPerfil, lstPrivilegios);
            visualHelper.mostrarMensajeSatisfaccion("Se modificó satisfactoriamente el perfil");
            (new blLog()).registrarLog(this.usuario.getIdUsuario(), this.usuario.getCargo(), "Se modificó el perfil: "+perfil.getId()+" - "+perfil.getDescripcion());
            this.dispose();
        }
        catch (Exception e){
            e.printStackTrace();
            visualHelper.mostrarMensajeError("No se pudo registrar el perfil.");
        }
    }//GEN-LAST:event_btnModificar1ActionPerformed

    private void btnModificar2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnModificar2ActionPerformed
        // TODO add your handling code here:
        ArrayList<Object> lstPrivilegiosDisponibles = new ArrayList<Object>();
        for (int i=0; i<this.lstDisponibles.getModel().getSize();i++)
            lstPrivilegiosDisponibles.add(this.lstDisponibles.getModel().getElementAt(i));

        ArrayList<Object> lstPrivilegiosActuales = new ArrayList<Object>();
        for (int i=0; i<this.lstActuales.getModel().getSize();i++)
            lstPrivilegiosActuales.add(this.lstActuales.getModel().getElementAt(i));


        if (this.lstActuales.getSelectedIndex() != -1){
            Object[] lstPrivilegiosAntiguos  = this.lstActuales.getSelectedValues();

            int[] indices = this.lstActuales.getSelectedIndices();
            for (int i=indices.length; i>0; i--)
                lstPrivilegiosActuales.remove(indices[i-1]);


            DefaultListModel modeloDisp = new DefaultListModel();
            DefaultListModel modeloAct = new DefaultListModel();

            for (int i=0; i<lstPrivilegiosDisponibles.size();i++){
                modeloDisp.addElement(lstPrivilegiosDisponibles.get(i));
            }

            for (int i=0; i<lstPrivilegiosAntiguos.length;i++){
                modeloDisp.addElement(lstPrivilegiosAntiguos[i]);
            }

            for (int i=0; i<lstPrivilegiosActuales.size();i++){
                modeloAct.addElement(lstPrivilegiosActuales.get(i));
            }

            this.lstActuales.setModel(modeloAct);
            this.lstDisponibles.setModel(modeloDisp);
        }
        else
            JOptionPane.showMessageDialog(this, "Debe elegir un privilegio.", "Información", JOptionPane.INFORMATION_MESSAGE);

    }//GEN-LAST:event_btnModificar2ActionPerformed

    private void listarPrivilegios(){

        this.txtNombre.setText(this.strPerfil);

        DefaultListModel modeloAct = new DefaultListModel();
        DefaultListModel modeloDisp = new DefaultListModel();

        bePerfil perfil = new bePerfil();
        blPerfil gestorPerfiles = new blPerfil();
        perfil = gestorPerfiles.queryByNombre(this.strPerfil);

        blPerfilxPrivilegio gestorPerfilxPrivilegios = new blPerfilxPrivilegio();
        ArrayList<bePerfilxPrivilegio> listaPerfilxPrivilegios = gestorPerfilxPrivilegios.queryById(perfil.getId());

        blPrivilegio gestorPrivilegios = new blPrivilegio();
        bePrivilegio privilegio = new bePrivilegio();

        int idPrivilegio;
        ArrayList<bePrivilegio> listaPrivilegiosDisp = new ArrayList<bePrivilegio>();
        listaPrivilegiosDisp = gestorPrivilegios.queryAll();

        for (int i=0; i<listaPerfilxPrivilegios.size();i++){
            idPrivilegio = listaPerfilxPrivilegios.get(i).getIdPrivilegio();
            privilegio = gestorPrivilegios.queryById(idPrivilegio);
            modeloAct.addElement(privilegio.getDescripcion());

            //Se elimina el privilegio encontrado de la lista de Privilegios Disponible
            for (int j=0; j<listaPrivilegiosDisp.size(); j++)
                if (listaPrivilegiosDisp.get(j).getId() == idPrivilegio)
                    listaPrivilegiosDisp.remove(j);
        }

        for (int i=0; i<listaPrivilegiosDisp.size();i++){
                modeloDisp.addElement(listaPrivilegiosDisp.get(i).getDescripcion());
        }

        this.lstDisponibles.setModel(modeloDisp);
        this.lstActuales.setModel(modeloAct);
    }

    /**
    * @param args the command line arguments
    */
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnModificar;
    private javax.swing.JButton btnModificar1;
    private javax.swing.JButton btnModificar2;
    private javax.swing.JButton btnRestaurar;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JLabel lblNombre;
    private javax.swing.JLabel lblNombre1;
    private javax.swing.JLabel lblNombre2;
    private javax.swing.JLabel lblTitulo;
    private javax.swing.JList lstActuales;
    private javax.swing.JList lstDisponibles;
    private javax.swing.JTextField txtNombre;
    // End of variables declaration//GEN-END:variables

}
